package com.atguigu.servicebase.exceptionHandler;

import com.atguigu.commonutils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @ControllerAdvice : 控制器增强（也就是说给控制器类增加功能--异常处理功能）
 *           位置：在类的上面。
 *  特点：必须让框架知道这个注解所在的包名，需要在springmvc配置文件声明组件扫描器。
 *  指定@ControllerAdvice所在的包名
 */
@ControllerAdvice
@Slf4j//为在日志文件中输入信息加的注解
public class GlobalExceptionHandler {
    //定义方法，处理发生的异常
    /*
        处理异常的方法和控制器方法的定义一样， 可以有多个参数，可以有ModelAndView,
        String, void,对象类型的返回值

        形参：Exception，表示Controller中抛出的异常对象。
        通过形参可以获取发生的异常信息。

        @ExceptionHandler(异常的class)：表示异常的类型，当发生此类型异常时，
        由当前方法处理
     */
    //指定出现什么异常执行这个方法
    @ExceptionHandler(value=Exception.class)//异常处理器-指定什么样的异常将交给此代码执行
    @ResponseBody//由于不是controller中的内容，加此注解确保可以返回json数据
    public R error(Exception e){
        e.printStackTrace();
        return R.error().message("执行了全局异常处理..");
    }

    //特定的异常(用的较少)


    //自定义异常
    @ExceptionHandler(value=GuliException.class)//指定什么样的异常将交给此代码执行
    @ResponseBody//由于不是controller中的内容，加此注解确保可以返回json数据
    public R error(GuliException e){
        log.error(e.getMessage());//这里表示将异常代表写入到对应的日志当中去
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());
    }
}
